FROM openjdk:8
WORKDIR /root #设置工作目录
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ADD config/ /root/config/
ADD lib/ /root/lib/
ADD my-api.jar /root/app.jar
# 【在Dockerfile中，ADD命令用于将本地文件或目录复制到镜像中】
ENTRYPOINT ["java","-jar","/root/app.jar"]

### ENTRYPOINT ["java","-jar","/root/app.jar"]  这句Dockerfile配置有什么作用？
#ENTRYPOINT ["java", "-jar", "/root/app.jar"] 是 Dockerfile 中的一个关键指令，用于定义容器启动时执行的默认命令。它的作用如下：
#
#1. 核心功能
#指定容器启动时自动运行的命令，格式为 ENTRYPOINT ["可执行文件", "参数1", "参数2", ...]（推荐使用 JSON 数组格式）。
#
#示例中：
#
#dockerfile
#ENTRYPOINT ["java", "-jar", "/root/app.jar"]
#表示容器启动时会执行 java -jar /root/app.jar，即运行一个 Java 应用（假设 app.jar 是 Spring Boot 或其他 Java 应用的打包文件）。
#
#2. 与 CMD 的区别
#指令	作用	是否可被覆盖
#ENTRYPOINT	定义容器启动时的主命令（通常用于固定不可变的执行逻辑）。	不可直接覆盖，但可通过 --entrypoint 修改。
#CMD	定义默认参数（通常为可变部分），会被 docker run 后的参数替换。	可以被 docker run 后的参数完全覆盖。
#常见组合：
#
#dockerfile
#ENTRYPOINT ["java", "-jar"]  # 固定主命令
#CMD ["/root/app.jar"]        # 默认参数，可被覆盖
#运行容器时：
#
#若直接 docker run my-image，则执行 java -jar /root/app.jar。
#
#若 docker run my-image /root/other.jar，则 CMD 被覆盖，执行 java -jar /root/other.jar。
#
#3. 为什么用 ENTRYPOINT + 数组格式？
#数组格式（Exec 模式）：
#
#直接运行命令（不通过 Shell），避免信号处理问题（如 SIGTERM 无法正确传递给 Java 进程）。
#
#示例中 java -jar 会作为 PID 1 进程运行，确保日志输出和信号接收正常。
#
#Shell 格式（不推荐）：
#
#dockerfile
#ENTRYPOINT java -jar /root/app.jar  # 通过 /bin/sh -c 执行，可能引发信号问题
#4. 实际应用场景
#场景 1：运行 Spring Boot 应用
#dockerfile
#FROM openjdk:17
#COPY target/my-app.jar /root/app.jar
#ENTRYPOINT ["java", "-jar", "/root/app.jar"]
#构建镜像后，运行容器时会自动启动 Java 应用。
#
#场景 2：允许动态传参
#dockerfile
#ENTRYPOINT ["java", "-jar"]
#CMD ["/root/app.jar"]  # 允许运行时替换为其他 JAR 文件
#运行示例：
#
#bash
#docker run my-image                          # 默认运行 /root/app.jar
#docker run my-image /root/custom-app.jar     # 覆盖 CMD，运行 custom-app.jar
#5. 注意事项
#确保文件路径正确：
#
#/root/app.jar 必须存在于容器内（通过 COPY 或 ADD 指令提前复制）。
#
#避免重复定义：
#
#如果 Dockerfile 中同时写了 ENTRYPOINT 和 CMD，CMD 的内容会作为 ENTRYPOINT 的参数。
#
#调试技巧：
#
#若需临时覆盖 ENTRYPOINT（例如进入容器 Shell），可使用：
#
#bash
#docker run --entrypoint /bin/bash -it my-image
#总结
#作用：定义容器启动时运行的固定命令（如启动 Java 应用）。
#
#优势：
#
#使用 Exec 模式（数组格式）避免 Shell 解析问题。
#
#适合作为主进程（PID 1）运行，确保应用日志和信号正常处理。
#
#扩展性：结合 CMD 可实现默认参数的可覆盖性。
#
#如果你的应用是 Java 服务，这种配置是最佳实践！